﻿
//元件引用分析类
namespace n_ConstLink
{
using System;
using n_ConstString;
using n_ET;
using n_MemberType;
using n_Parse;
using n_ParseNet;
using n_VarList;
using n_VarNode;

public static class ConstLink
{
	static string UnitName;
	
	//获取元件信息,生成: 元件列表 函数列表 变量列表
	public static void Record()
	{
		Parse.DealWith( ref UnitName, new Parse.MemberListHandle( 成员列表 ) );
		
		//遍历常量列表,计算每个常量的值
		int time = 0;
		while( !CompleteExpressionValue() ) {
			++time;
			if( ET.isErrors() ) {
			   	break;
			}
			if( time > 500 ) {
				ET.WriteLineError( 0, 0, "常量计算循环过大" );
				break;
			}
		}
	}
	
	static void 成员列表( int Index )
	{
		for( int i = 1; i < ParseNet.NodeSet[ Index ].Length; ++i ) {
			int index = int.Parse( ParseNet.NodeSet[ Index ][ i ] );
			
			//判断是否元件定义
			if( ParseNet.NodeSet[ index ][ 0 ] == ParseNet.Node.元件 ) {
				元件( index );
				continue;
			}
			//判断是否连接器定义
			if( ParseNet.NodeSet[ index ][ 0 ] == ParseNet.Node.连接器 ) {
				连接器( index );
				continue;
			}
		}
	}
	
	static void 元件( int Index )
	{
		Parse.Unit( ref UnitName, Index, new Parse.MemberListHandle( 成员列表 ) );
	}
	
	static void 连接器( int Index )
	{
		//提取第一个成员信息
		int FirstIndex = int.Parse( ParseNet.NodeSet[ Index ][ 2 ] );
		int ErrorIndex1 = 0;
		string FirstName = null;
		Parse.GetMemberNames( UnitName, FirstIndex, ref FirstName, ref ErrorIndex1 );
		
		//提取第二个成员信息
		int SecondIndex = int.Parse( ParseNet.NodeSet[ Index ][ 4 ] );
		int ErrorIndex2 = 0;
		string SecondName = null;
		Parse.GetMemberNames( UnitName, SecondIndex, ref SecondName, ref ErrorIndex2 );
		
		//判断成员是否为静态变量类型
		int FirstConstIndex = VarList.GetStaticIndex( FirstName );
		if( FirstConstIndex != -1 ) {
			
			//这里允许对一个常量重定向
			if( VarList.Get( FirstConstIndex ).isConst ) {
				VarList.Get( FirstConstIndex ).RealRefType = MemberType.RealRefType.link;
			}
			if( VarList.Get( FirstConstIndex ).RealRefType != MemberType.RealRefType.link ) {
				ET.WriteParseError( ErrorIndex1, "连接器的左端必须为引用类型常量:" + FirstName );
				return;
			}
			VarList.Get( FirstConstIndex ).TargetMemberName = SecondName;
			return;
		}
	}
	
	//遍历常量列表,计算每个常量的值
	static bool CompleteExpressionValue()
	{
		bool isOK = true;
		for( int i = 0; i < VarList.length; ++i ) {
			VarNode n = VarList.Get( i );
			if( n.isConst && n.Value.StartsWith( "I " ) ) {
				int Index = int.Parse( n.Value.Remove( 0, 2 ) );
				string UnitName = n.Name.Remove( n.Name.LastIndexOf( "." ) );
				string Result = ConstExpression.GetExpressionValue( Index, UnitName );
				if( Result == null ) {
					isOK = false;
				}
				else {
					n.Value = Result;
				}
			}
		}
		return isOK;
	}
}
}



